package com.atguigu.springbootdemo.controller;

import com.atguigu.springbootdemo.beans.Employee;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * Created by Smexy on 2023/3/28
 *      注意事项：
 *              所以建的包必须是 SpringbootdemoApplication(主启动类)所在包的子包。
 *              违反以上规则，会导致容器扫描不到。
 *              容器只会扫描 主启动类包及其子包。
 *
 *
 *      controller: 控制器。
 *                      把处理http请求，给出响应结果的类，称为控制器
 *
 *
 *      @Controller的作用：
 *              ①告诉同事，这个类的作用是一个控制器
 *              ②给容器看，容器扫描到顶了这个注解的类，会自动为这个类在容器中创建一个单例对象。
 *
 */
//@Controller
@RestController //@Controller + 为当前类的所有方法都自动标注 @ResponseBody
public class HelloController
{
    /*
        请求三要素:
            url： http://localhost:8089/hello
            请求方式: get
            请求参数: 无

         处理请求的方法必须有返回值！
     */

    /*
            @RequestMapping； 作用将url和处理url的方法一一映射。
                        不在乎请求方式。 能处理任何方式的请求，只关心url是否对上

                            java代码中url路径只写 端口号后面的部分！


            @ResponseBody: 将方法的返回值，直接作为数据写入reponse中。
                          加了这个数据，返回数据，而不是返回页面！

                      数据的分类：
                            字面量:  变量，从字面上就能看出变量值，无需程序运行！
                                        int i = 0;
                                        String str = "hello";
                                     基本数据类型及包装类 和 String都是字面量！

                                     直接把字面量放入reponse!

                            非字面量: 变量，从字面上看不出变量值，需程序运行！

                                  String name =  (Employee)e.getName();
                                        自定义的Bean都是非字面量。

                                     使用jackson(处理json)，把非字面量转换为json再放入响应体。
     */
    @RequestMapping(value = "/hello")
    public  Object  handle1(){

        System.out.println("处理了hello请求...事情已办!");

        //html页面只能发get请求访问
        return "/success.html";
    }

    //@ResponseBody
    @RequestMapping(value = "/returnzml")
    public  Object  handle2(){
        return "/success.html";
    }

    //@ResponseBody
    @RequestMapping(value = "/returnfzml")
    public  Object  handle3(){
        Employee employee = new Employee(1, "jack", "male", "jack@qq.com");
        return employee;
    }

    /*
            接收请求参数:
                    格式： k=v

                普通请求参数：     在处理方法的形参位置声明和参数名名字一样的形参即可。
                                 参数类型兼容即可。

                                 /sendCommonParam?name=jack&age=20
     */
    //@ResponseBody
    @RequestMapping(value = "/sendCommonParam")
    public Object handle4(String name , Integer age){

        System.out.println("name:"+name+",age:"+age);

        return "ok";
    }

    /*
        JSON格式的请求参数:
                在浏览器或页面中无法直接模拟，需要使用js来发送！
                可以在测试工具中模拟！

                需要在方法的参数列表中使用
                    Map: 请求参数会作为key，参数值作为value。
                            请求发送的参数不确定。
                    或
                    Bean:  Bean中必须有和请求参数同名的属性，才能收到。
                            前台请求的参数格式固定，映射为Bean


                在参数列表的参数前，添加@RequestBody
     */
    @ResponseBody
    @RequestMapping(value = "/sendJsonParam")
    public Object handle5(
        // @RequestBody Employee employee
        @RequestBody Map<String,Object> employee
        ){

        System.out.println(employee);

        return "ok";
    }

    /*
        url格式:  /emp/1/a
     */
    @ResponseBody
    @RequestMapping(value = "/emp/{haha}/a")
    public Object handle6(@PathVariable("haha") Integer id){

        System.out.println(id);

        return "ok";
    }

    // 要求url的请求方式必须是get，否则不处理。报错405
   // @GetMapping(value = "/hi")
    // 要求url的请求方式必须是post，否则不处理。报错405
    @PostMapping(value = "/hi")
    public Object handle7(){

        System.out.println("hi");

        return "ok";
    }

    /*@PostMapping(value = "/hi")
    public Object handle8(){

        System.out.println("hi");

        return "ok";
    }*/
}
